/**
 *  (c)
 * <p>
 *
 * <p>
 *
 */

package com.nn.smart.bus.service;

import com.nn.smart.bus.commons.tools.utils.Result;
import com.nn.smart.bus.dto.epdc.GridForLeaderRegisterDTO;
import com.nn.smart.bus.dto.epdc.form.UserSysDeptInfoFormDTO;
import com.nn.smart.bus.dto.epdc.result.UserSysDeptInfoResultDTO;
import com.nn.smart.bus.entity.SysDeptEntity;
import com.nn.smart.bus.commons.mybatis.service.BaseService;
import com.nn.smart.bus.dto.*;

import java.util.List;
import java.util.Map;

/**
 * 部门管理
 *
 * @author nanning
 * @since 1.0.0
 */
public interface SysDeptService extends BaseService<SysDeptEntity> {

    List<SysDeptDTO> list(Map<String, Object> params);

    SysDeptDTO get(Long id);

    void save(SysDeptDTO dto);

    void update(SysDeptDTO dto);

    void delete(Long id);

    /**
     * 根据部门ID，获取下属部门
     *
     * @param pid
     * @return java.util.List<com.nn.smart.bus.dto.SysSimpleDeptDTO>
     * @author
     */
    List<SysSimpleDeptDTO> subList(String pid);

    /**
     * 根据部门ID，获取本部门及子部门ID列表
     *
     * @param id 部门ID
     */
    List<Long> getSubDeptIdList(Long id);

    /**
     * 获取所有下属网格ID集合
     *
     * @param pid 部门ID
     * @return com.nn.smart.bus.commons.tools.utils.Result<java.util.List < java.lang.Long>>
     * @author nanning
     * @date 2019/9/5 13:45
     */
    Result<List<Long>> listGridIdByPid(Long pid);

    /**
     * 通过网格ID获取该网格所有上级机构
     *
     * @param gridId
     * @return com.nn.smart.bus.commons.tools.utils.Result<com.nn.smart.bus.dto.CompleteDeptDTO>
     * @author nanning
     */
    Result<CompleteDeptDTO> getCompleteDept(String gridId);

    /**
     * 通过网格ID获取该网格所有上级机构
     *
     * @param deptId
     * @return com.nn.smart.bus.commons.tools.utils.Result<com.nn.smart.bus.dto.CompleteDeptDTO>
     * @author nanning
     * @date 2019/9/7 09:13
     */
    Result<ParentAndAllDeptDTO> getParentAndAllDept(String deptId);

    /***
     * 通过编码得到党委编码
     * @param partyCode
     * @return com.nn.smart.bus.commons.tools.utils.Result<java.util.Map < java.lang.String, java.lang.String>>
     * @author nanning
     */
    Map<String, String> getIdByCode(String partyCode);

    /***
     * 校验编码是否重复
     * @param dto
     * @return java.lang.Integer
     * @author nanning
     * @date 2019/9/21 14:14
     */
    Integer getCodeCount(SysDeptDTO dto);

    Integer getAreaCodeCount(SysDeptDTO dto);

    /**
     * 通过网格id集合，获取网格长管理的所有网格
     *
     * @param gridIdList
     * @return java.util.List<com.nn.smart.bus.dto.epdc.GridLeaderRegisterDTO>
     * @author nanning
     */
    List<GridForLeaderRegisterDTO> selectListGridForLeader(List<String> gridIdList);

    /**
     * 根据部门id，获取所有上级部门id，英文逗号隔开拼接字符串
     *
     * @param deptId
     * @return com.nn.smart.bus.commons.tools.utils.Result<java.lang.String>
     * @author nanning
     * @date 2019/11/27 15:09
     */
    Result<String> getParentDeptIds(Long deptId);

    /**
     * 根据部门id，获取部门所在四级机构的所有机构名称
     *
     * @param deptId
     * @return com.nn.smart.bus.commons.tools.utils.Result<java.util.List < java.lang.String>>
     * @author nanning
     */
    Result<List<String>> getCompleteDeptList(Long deptId);

    /**
     * 组装用户部门多层结构
     *
     * @param userId
     * @return void
     * @author nanning
     * @date 2019/11/27 14:33
     */
    void packageUserDeptOption(Long userId);

    /**
     * 从缓存中读取用户部门层级结构
     *
     * @return com.nn.smart.bus.dto.DeptOption
     * @author nanning
     * @date 2019/11/28 11:13
     */
    DeptOption getUserDeptOption();

    /**
     * @param formDTO
     * @return java.util.List<com.nn.smart.bus.dto.epdc.result.UserSysDeptInfoResultDTO>
     * @author nanning
     * @Description
     * @Date 2019/12/4 19:43
     **/
    List<UserSysDeptInfoResultDTO> listUserSysDeptInfoResultDTO(UserSysDeptInfoFormDTO formDTO);


    /***
     * 组装所有部门
     * @param
     * @return void
     * @author nanning
     * @date 2019/12/13 13:54
     */
    void packgeAllDeptOption();

    /***
     * 获取所有部门树
     * @param
     * @return com.nn.smart.bus.commons.tools.utils.Result<com.nn.smart.bus.dto.DeptOption>
     * @author nanning
     * @date 2019/12/13 14:48
     */
    Result<DeptOption> getDeptTree();

    /**
     * @param
     * @return com.nn.smart.bus.commons.tools.utils.Result<com.nn.smart.bus.dto.DeptOption>
     * @author nanning
     * @Description 获取所有部门树:二级只要街道
     * @Date 2020/1/31 10:30
     **/
    Result<DeptOption> getDeptTreeForEpiDemic();

    /**
     * 获取用户部门多层结构（完整层级结构，包括顶级部门），用户前端显示，请求需携带token
     *
     * @return com.nn.smart.bus.dto.DeptOption
     * @author nanning
     * @date 2020/1/28 10:40
     */
    DeptOption getAllDeptOptionByLoginUser();

    /**
     * 获取用户部门层级结构（街道-社区），用户前端显示，请求需携带token
     *
     * @return com.nn.smart.bus.dto.DeptOption
     * @author nanning
     * @date 2020/2/10 13:38
     */
    DeptOption getMiddleByLoginUser();

    /**
     * 获取用户部门层级结构（街道），用户前端显示，请求需携带token
     *
     * @return com.nn.smart.bus.dto.DeptOption
     * @author nanning
     * @date 2020/2/11 11:31
     */
    DeptOption getStreetByLoginUser();
    /**
     * @Description  获取用户部门多层结构，用户前端显示，请求需携带token - 工作日志使用
     * @author nanning
     * @Date  2021/1/27
     * @Param [userId]
     * @return com.nn.smart.bus.commons.tools.utils.Result<com.nn.smart.bus.dto.DeptOption>
     **/
    Result<DeptOption> getUserDeptOptionByUserId(String userId);
}
